package main

import (
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func pathSum(root *TreeNode, target int) (ans [][]int)  {
	val := []int{}
	// 内部函数的定义方式
	var dfs func(node *TreeNode, target int)
	dfs = func(node *TreeNode, target int) {
		// 递归中止判断
		if node == nil {
			return
		}
		val = append(val, node.Val)
		// 表示叶子是节点
		if node.Left == nil && node.Right == nil {
			//val = append(val, root.Val)
			sum := 0
			for _, value := range val {
				sum += value
			}
			if sum == target {
				ans = append(ans, append([]int(nil),val...))
			}
			val = val[:len(val)-1] // 需要去掉这个已经添加的数值;
			return
		}
		dfs(node.Left, target)
		dfs(node.Right, target)
		val = val[:len(val)-1]
	}
	dfs(root, target)
	return
}
/**
	求二叉树的 深度
 */
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxDepth(root *TreeNode) (maxdep int) {
	dep := 0
	// 内部函数的定义方式
	var dfs func(*TreeNode)
	dfs = func(node *TreeNode) {
		// 递归中止判断
		if node == nil {
			return
		}
		dep++
		defer func() {dep--}() // 匿名函数的使用
		// 表示叶子是节点
		if node.Left == nil && node.Right == nil {
			//val = append(val, root.Val)
			if maxdep<dep{
				maxdep=dep
			}
			return
		}
		dfs(node.Left)
		dfs(node.Right)
	}
	dfs(root)
	return
}

func main() {
	root := &TreeNode{5, &TreeNode{4,&TreeNode{11,&TreeNode{7, nil, nil} , &TreeNode{2, nil, nil}} , nil}, &TreeNode{8, &TreeNode{13, nil, nil}, &TreeNode{4, &TreeNode{5,nil , nil}, &TreeNode{1,nil , nil}}}}
	fmt.Println(pathSum(root,22 ))
	fmt.Println(maxDepth(root))
}
// 程序代码有问题
// 有debug 没有调整完成，需要调整debug